有一句話說得好,「不怕一萬,只怕萬一」,如何檢查程式上的錯誤是一件重要的議題。好的工程師會懂得防範於未來。現在我們就來用Ruby練習一下錯誤與例外處理吧!
Day26 Ruby的錯誤處理機制 Rescue. Explain Error Handling in Ruby.
Ruby能以區隔的 (compartmentalized) 方式處理錯誤及例外的程式碼區塊,基本架構:
begin
到rescue
這段區間是程式可能會出錯的地方。
rescue
到end
是我們對於錯誤真正發生時的反應措施。
begin
error #something happens!
rescue
puts 'ERROR! Rescue me!' #=> ERROR! Rescue me!
end
沒有人不犯錯的,犯錯是最好的學習機會!工程師的有一部份工作就是尋找錯誤出現在哪裡,更進一步地預防所有可能會出現的錯誤!這張圖我非常喜歡,把各種錯誤類型用架構方式呈現:
而且許多錯誤類型,我們在鐵人賽夠過這幾天來的舉例都有經歷到呢!!!
當然,遇到最多的,還是ScriptError
下的Syntax Error
,
以及StandardError
下的Type Error
和NoMethod Error啦
(顯示為蒐集各類型錯誤很開心的樣子。)
Rescue
段落避免可能的Error
範例我們從上小學的時候就在數學課學過,0不能當分母(denominator)。身為工程師,我們預期會有User不小心(或是故意)輸入了0在分母,造成ZeroDivisionError
。因此在rescue
段落,將0用全域變數$!
把最新的錯誤訊息傳進來,並提醒使用者再輸入一次分母:
begin
print "Enter numerator: "
num = Integer(gets)
print "Enter denominator: "
den = Integer(gets)
rate = num / den
puts rate
rescue
print $!
puts
print "Enter denominator other than 0:"
den = Integer(gets)
rate = num / den
puts rate
end
程式運行過程如下:
Enter numerator: 5
Enter denominator: 0
divided by 0
Enter denominator other than 0: 1
5
輸入0的情況可以順利被我們rescue起來啦!
[第25天]在看rails文件的.exists
方法是怎麼被刻出來的時候,發現了rescue...end
:
# File activeresource/lib/active_resource/base.rb, line 869
def exists?(id, options = {})
if id
prefix_options, query_options = split_options(options[:params])
path = element_path(id, prefix_options, query_options)
response = connection.head(path, headers)
response.code.to_i == 200
end
# id && !find_single(id, options).nil? id存在且不為空
rescue ActiveResource::ResourceNotFound, ActiveResource::ResourceGone
false
end
參考了數十篇文章如下~~現在總算看得懂了!
Ref: